/**
 * @addtogroup hj1239_chl_session_if
 * hj1239_chl_session_if
 * @{
 */
/**
 * @file        hj1239_chl_session_if.h
 * @brief       XXXX
 * @note        XXXX
 * @author      靳普诏(puzhao.jin@hopechart.com)
 * @date        2023/10/18
 * @version     1.0

 * @par         修改日志
 * <table>
 * <tr><th>Date         <th>Version     <th>Author      <th> Description
 * <tr><td>2023/10/18   <td>1.0         <td>靳普诏       <td> 创建初始版本
 * @copyright 杭州鸿泉物联网技术股份有限公司
 */

#ifndef _BSC_HJ1239_CHL_SESSION_IF_H_
#define _BSC_HJ1239_CHL_SESSION_IF_H_


#include "gbmsg17691/gbc_17691_msg.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * 会话层状态
 * @return
 */
enum IBsHj1239ChlSessionStateEnumTag
{
    kBsHj1239ChlSessionStateIdle = 0,          ///< 空闲
    kBsHj1239ChlSessionStateNone = 1,          ///< 未初始化状态
    kBsHj1239ChlSessionStateInit = 2,          ///< 已初始化
    kBsHj1239ChlSessionStateConnecting = 3,    ///< 正在连接
    kBsHj1239ChlSessionStateConnectTimeout = 4,///< 连接超时
    kBsHj1239ChlSessionStateConnected = 5,     ///< 已连接
    kBsHj1239ChlSessionStateDisconnect = 6,    ///< 断开连接
};

typedef enum IBsHj1239ChlSessionStateEnumTag IBsHj1239ChlSessionStateEnum;



typedef struct IBsHj1239ChlSessionTag IBsHj1239ChlSession;

/**
 * 返回会话状态
 * @param sender: 对象指针
 * @return 会话状态，参考IBsHj1239ChlSessionStateEnum
 */
typedef UInt8 (*IBsHj1239ChlSessionDoState)(IBsHj1239ChlSession *sender);


/**
 * 发送国六字节型消息
 * @param sender: 对象指针
 * @param buf: 缓存
 * @param buf_len: 缓存长度
 * @return >= 0: 成功发送的数据大小
 *         < 0: 发送失败
 */
typedef Int32 (*IBsHj1239ChlSessionDoSendBinary)(IBsHj1239ChlSession *sender, Byte *buf, Int32 buf_len);


/**
 * 会话调度
 * @param sender: 对象指针
 * @return
 */
typedef void (*IBsHj1239ChlSessionDoRunOnce)(IBsHj1239ChlSession *sender);

/**
 * 重连
 * @param sender: 对象指针
 * @return
 */
typedef void (*IBsHj1239ChlSessionDoReconnect)(IBsHj1239ChlSession *sender);



typedef struct TBsHj1239ChlSessionOnStateChangeTag  TBsHj1239ChlSessionOnStateChange;

/**
 * 会话状态变化通知
 * @param user_param: 用户指针
 * @param state: 会话状态，参考IBsHj1239ChlSessionStateEnum
 * @return
 */
typedef void(*TBsHj1239ChlSessionStateDoChange)(void *user_param, UInt8 state);

struct TBsHj1239ChlSessionOnStateChangeTag
{
    TBsHj1239ChlSessionStateDoChange Method;
    void *user_param;
};

/**
 * 状态通知
 * @param user_param: 对象指针
 * @param *user_param: 用户指针
 * @param do_change: 状态通知回调
 * @return
 */
typedef void (*IBsHj1239ChlSessionDoSetStateNotify)(IBsHj1239ChlSession *sender, void *user_param, TBsHj1239ChlSessionStateDoChange do_change);




typedef struct TBsHj1239ChlSessionOnDataNotifyTag  TBsHj1239ChlSessionOnDataNotify;

/**
 * 数据接收情况通知
 * @param *user_param   用户指针
 * @param *buf      接收数据地址
 * @param buf_len   接收数据大小
 * @return 
 */
typedef void (*TBsHj1239ChlSessionDoRecvDataNotify)(void *user_param, const Byte *buf, Int32 buf_len);


/**
 * 消息接收情况通知
 * @param *user_param   用户指针
 * @param msg           收到的消息包
 * @return 
 */
typedef void (*TBsHj1239ChlSessionDoRecvMsgNotify)(void *user_param, const TGbc17691MsgHead *msg);

/**
 * 数据发送情况通知
 * @param *user_param   用户指针
 * @param *buf          发送数据地址
 * @param buf_len       发送数据长度
 * @param send_ok       发送结果
 * @return 
 */
typedef void (*TBsHj1239ChlSessionDoSendDataNotify)(void *user_param, const Byte *buf, Int32 buf_len, Bool send_ok);

/**
 * 消息发送情况通知
 * @param *user_param   用户指针
 * @param msg           收到的消息包
 * @return 
 */
typedef void (*TBsHj1239ChlSessionDoSendMsgNotify)(void *user_param, const TGbc17691MsgHead *msg, Bool send_ok);



struct TBsHj1239ChlSessionOnDataNotifyTag
{
    TBsHj1239ChlSessionDoRecvDataNotify DoRecvDataNotify;
    TBsHj1239ChlSessionDoSendDataNotify DoSendDataNotify;
    TBsHj1239ChlSessionDoRecvMsgNotify  DoRecvMsgNotify;
    TBsHj1239ChlSessionDoSendMsgNotify  DoSendMsgNotify;
    void *user_param;
};

/**
 * 设置数据收发通知方法
 * @param *sender       对象指针
 * @param *notify_api   通知方法对象指针（此处传入临时对象）
 * @return 
 */
typedef void (*IBsHj1239ChlSessionDoSetDataNotify)(IBsHj1239ChlSession *sender, TBsHj1239ChlSessionOnDataNotify *notify_api);


struct IBsHj1239ChlSessionTag
{
PROTECTED
    IBsHj1239ChlSessionDoRunOnce               DoRunOnce;              ///< 会话任务执行
    IBsHj1239ChlSessionDoReconnect             DoReconnect;            ///< 触发重连事件
    IBsHj1239ChlSessionDoSendBinary            DoSendBinary;           ///< 执行数据发送
    IBsHj1239ChlSessionDoSetStateNotify        DoSetStateNotify;       ///< 设置状态通知
    IBsHj1239ChlSessionDoSetDataNotify         DoSetDataNotify;        ///< 设置数据收发通知
};


/**
 * 会话调度
 * @param self: 对象指针
 * @return
 */
void IBsHj1239ChlSessionRunOnce(IBsHj1239ChlSession *self);


/**
 * 重连
 * @param self: 对象指针
 * @return
 */
void IBsHj1239ChlSessionReconnect(IBsHj1239ChlSession *self);

/**
 * 发送国六字节型消息
 * @param self: 对象指针
 * @param buf: 缓存
 * @param buf_len: 缓存长度
 * @return >= 0: 成功发送的数据大小
 *         < 0: 发送失败
 */
Int32 IBsHj1239ChlSessionSendBinary(IBsHj1239ChlSession *self, Byte *buf, Int32 buf_len);

/**
 * 设置状态通知
 * @param user_param: 对象指针
 * @param *user_param: 用户指针
 * @param do_change: 状态通知回调
 * @return
 */
void IBsHj1239ChlSessionSetStateNotify(IBsHj1239ChlSession *self, void *user_param, TBsHj1239ChlSessionStateDoChange do_change);


/**
 * 设置数据收发通知方法
 * @param *self       对象指针
 * @param *notify_api   通知方法对象指针（此处传入临时对象）
 * @return 
 */
void IBsHj1239ChlSessionSetDataNotify(IBsHj1239ChlSession *self, TBsHj1239ChlSessionOnDataNotify *notify_api);



#ifdef __cplusplus
}  ///< extern "C"
#endif

#endif  ///< _BSC_HJ1239_CHL_SESSION_IF_H_

/**
 * @}  Generated on "2023-10-18 14:22:23" by the tool "gen_hq_file.py >> V20230509_1" 
 */

